package com.example.detectivedemo.domain.product;

import com.example.detectivedemo.domain.generic.GenericEntity;
import com.example.detectivedemo.domain.generic.GenericService;

import java.util.List;
import java.util.Optional;

/**
 * 产品服务实现类
 * 负责产品相关的业务逻辑处理
 */
public class ProductService extends GenericService<Product> {
    
    private final ProductRepository productRepository;
    
    public ProductService(ProductRepository productRepository) {
        super(productRepository);
        this.productRepository = productRepository;
    }
    
    /**
     * 根据分类查询产品
     * @param category 产品分类
     * @return 分类下的所有产品
     */
    public List<Product> findByCategory(String category) {
        return productRepository.findByCategory(category);
    }
    
    /**
     * 根据价格范围查询产品
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @return 价格范围内的所有产品
     */
    public List<Product> findByPriceRange(double minPrice, double maxPrice) {
        return productRepository.findByPriceRange(minPrice, maxPrice);
    }
    
    /**
     * 根据名称模糊查询产品
     * @param name 产品名称关键词
     * @return 匹配的产品列表
     */
    public List<Product> findByNameLike(String name) {
        return productRepository.findByNameLike(name);
    }
    
    /**
     * 创建产品
     * @param product 产品对象
     * @return 创建的产品
     */
    @Override
    public Product create(Product product) {
        // 可以添加业务逻辑验证
        if (product.getPrice() < 0) {
            throw new IllegalArgumentException("产品价格不能为负数");
        }
        if (product.getStock() < 0) {
            throw new IllegalArgumentException("产品库存不能为负数");
        }
        return super.create(product);
    }
    
    /**
     * 更新产品
     * @param product 产品对象
     * @return 更新后的产品
     */
    @Override
    public Product update(Product product) {
        // 可以添加业务逻辑验证
        if (product.getPrice() < 0) {
            throw new IllegalArgumentException("产品价格不能为负数");
        }
        if (product.getStock() < 0) {
            throw new IllegalArgumentException("产品库存不能为负数");
        }
        return super.update(product);
    }
    
    /**
     * 减少产品库存
     * @param productId 产品ID
     * @param quantity 减少数量
     * @return 更新后的产品
     */
    public Product reduceStock(String productId, int quantity) {
        Optional<Product> optionalProduct = findById(productId);
        if (optionalProduct.isPresent()) {
            Product product = optionalProduct.get();
            if (product.getStock() >= quantity) {
                product.setStock(product.getStock() - quantity);
                return update(product);
            } else {
                throw new IllegalArgumentException("库存不足");
            }
        } else {
            throw new IllegalArgumentException("产品不存在");
        }
    }
    
    /**
     * 增加产品库存
     * @param productId 产品ID
     * @param quantity 增加数量
     * @return 更新后的产品
     */
    public Product increaseStock(String productId, int quantity) {
        Optional<Product> optionalProduct = findById(productId);
        if (optionalProduct.isPresent()) {
            Product product = optionalProduct.get();
            product.setStock(product.getStock() + quantity);
            return update(product);
        } else {
            throw new IllegalArgumentException("产品不存在");
        }
    }
}